package main

import (
	"fmt"
	"math"
)

//断言 的概念 用来判断 接口引用  是不是 一个 他的实现类
func main()  {

	var t1 Triangle=Triangle{3,4,5}
	fmt.Println("三角形周长：=",t1.peri())
	fmt.Println("三角形的面积:",t1.aera())

	//  直接定义 实现类
	var c1 Circle=Circle{5}
	fmt.Println("圆形的周长=", c1.peri())
	fmt.Println("圆形的面积：",c1.aera())

   var s1 Shape
	s1=t1
	fmt.Println(s1.peri())
	fmt.Println(s1.aera())


	var s2 Shape
	s2=c1  //实现子类 赋值给 接口
	fmt.Println(s2.aera())
	fmt.Println(s2.peri())

    getType(s2)
	getType2(s2)

}
func getType2(s Shape){
	fmt.Println("============getType2")

	switch ins:=s.(type) {

	case Triangle:
		fmt.Println("三角形。。",ins.a,ins.b,ins.c)
	case Circle:
		fmt.Println("园型",ins.radius)
	}
}
func getType(s Shape){
	if ins,ok :=s.(Triangle);ok{
		fmt.Println("是三角形的实现类",ins.a,ins.b,ins.c)
	}else if ins,ok :=s.(Circle);ok{
		fmt.Println("是三角形的实现类", ins.radius)
	}else {
		fmt.Println("没有类型")
	}
}


//定义一个 接口
type Shape interface {
	peri() float64 // 求周长
	aera() float64 //面积
}

// 三角形 实现类
type Triangle struct {
	a,b,c float64
}

func (t Triangle) peri() float64 {
	return  t.a+t.b+t.c
}

func (t Triangle) aera() float64{
	p:= t.peri()/2
	s:=math.Sqrt(p*(p-t.a)*(p-t.b)*(p-t.c))
	return s
}

// 园型实现类
type Circle struct {
	radius float64
}

func (c Circle) peri() float64{
	return c.radius*2*math.Pi
}
func (c Circle) aera()  float64{
	return  math.Pow(c.radius,2)*math.Pi
}
